#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: 
@time: 2024/3/2 11:16 AM
@Function: 请输入模块功能描述
"""
import asyncio
import os
import time
import allure
import pytest
from config.setting import FILE_PATH
from pages.logout_page.logout_page import LogoutPage
from utils.configParse import ConfigParse, config

page = None

output_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "screenshots")
print('---->', output_dir)


# 如果使用这个夹具，结果只是调用同一个浏览器
@pytest.fixture(scope = "session")
def set_up_tear_down(browser):
    context = browser.new_context(viewport = {'width': 1920, 'height': 1080})
    page = context.new_page()
    page.goto('http://xbasetest.dxbim.com:18898/user/login')
    yield page


# 如果使用这个夹具，结果每个用例都会调用一次浏览器
@pytest.fixture(scope = "session")
def set_up_tear_down_no_login(page):
    page.goto('http://xbasetest.dxbim.com:18898/user/login')
    yield page


# 基于上面要编写上下文
@pytest.fixture(scope = 'session')
def create_browser_context(playwright):
    browser = playwright.chromium.launch(headless = False)  # --start-maximized,channel = 'chrome'
    context = browser.new_context(viewport = {'width': 1920, 'height': 1080})
    page = context.new_page()
    page.goto(config.get_ini_login_url('xbasetest_url') + '/user/login')
    page.locator("//*[@id='login_userName']").fill(ConfigParse().get_ini_login_info('xbasetest_username'))
    page.locator("//*[@id='login_password']").fill(ConfigParse().get_ini_login_info('xbasetest_password'))
    page.locator("//button[@type='submit']").click()
    time.sleep(2)
    context.storage_state(path = "./auth/xbase.json")  # 这里存在自动开启标签页并关闭的动作
    context.close()
    browser.close()


# 这里配合上面的create_browser_context，可以不用重复登录，使用同一个上下文，这里如果使用需要去掉上面的context.storage_state这句
# @pytest.fixture()
# def set_up_tear_down_new1(create_browser_context):
#     context = create_browser_context
#     page = context.new_page()
#     page.pause()
#     yield page


# 这里配合上面的create_browser_context，由于新增了登录信息json文件，所以和下面结合可以读取认证authjson文件。这里如果使用需要加上上面的context.storage_state这句
@pytest.fixture(scope = 'session')
def set_up_tear_down_new(create_browser_context, browser):
    global page
    auth_json = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "auth", "xbase.json")
    context = browser.new_context(storage_state = auth_json,
                                  viewport = {'width': 1920, 'height': 1080})  # 创建上下文，浏览器实例1，便于后续多用户操作
    page = context.new_page()
    yield page
    LogoutPage(page).logout_xbase()
    context.close()
    browser.close()


@pytest.hookimpl(tryfirst = True, hookwrapper = True)
def pytest_runtest_makereport(item, call):
    """
    获取每个用例状态的钩子函数
    :param item: 测试用例
    :param call: 测试步骤
    :return:
    """
    # 获取钩子方法的调用结果
    out_come = yield
    rep = out_come.get_result()  # 从钩子方法的调用结果中获取测试报告
    # rep.when表示测试步骤，仅仅获取用例call 执行结果是失败的情况, 不包含 setup/teardown
    if rep.when == "call" and rep.failed:
        print("测试用例：{}".format(item))
        print("用例描述：{}".format(item.function.__doc__))
        print("测试步骤：{}".format(call))
        # 添加allure报告截图
        if hasattr(page, "screenshot"):
            with allure.step('添加失败截图...'):
                screenshot_name = time.strftime("%Y%m%d_%H%M%S") + ".png"
                path = FILE_PATH.get('test_screenshot_dir') + "/" + screenshot_name
                file = page.screenshot(path = path)
                allure.attach(file, "失败截图",
                              allure.attachment_type.PNG)
